/**
 * 权限控制工具
 * 用于管理不同用户角色的权限
 */

// 用户角色定义
const USER_ROLES = {
    OPERATOR: 'operator', // 操作员，可以控制设备
    VIEWER: 'viewer',    // 观察员，只能查看数据
    ADMIN: 'admin'      // 管理员,可控制设备
};

// 权限定义
const PERMISSIONS = {
    VIEW_DATA: 'view_data',           // 查看数据权限
    CONTROL_DEVICE: 'control_device', // 控制设备权限
    CHANGE_SETTINGS: 'change_settings', // 修改设置权限
    ADMIN_FUNCTIONS: 'admin_functions'  // 管理员功能权限
};

// 角色权限映射
const ROLE_PERMISSIONS = {
    [USER_ROLES.ADMIN]: [
        PERMISSIONS.VIEW_DATA,
        PERMISSIONS.CONTROL_DEVICE,
        PERMISSIONS.CHANGE_SETTINGS,
        PERMISSIONS.ADMIN_FUNCTIONS
    ],
    [USER_ROLES.OPERATOR]: [
        PERMISSIONS.VIEW_DATA,
        PERMISSIONS.CONTROL_DEVICE,
        PERMISSIONS.CHANGE_SETTINGS
    ],
    [USER_ROLES.VIEWER]: [
        PERMISSIONS.VIEW_DATA
    ]
};


/**
 * 获取当前用户角色
 * @returns {string} 用户角色，默认为观察员
 */
function getCurrentUserRole() {
    const user = getCurrentUser();
    // 确保角色值统一为小写
    if (user && user.role) {
        return user.role.toLowerCase();
    }
    return USER_ROLES.ADMIN;
}

/**
 * 获取当前登录用户信息
 * @returns {Object|null} 用户信息对象，如果未登录则返回null
 */
function getCurrentUser() {
    try {
        const userJson = localStorage.getItem('currentUser');
        if (!userJson) return null;

        return JSON.parse(userJson);
    } catch (e) {
        console.error('获取用户信息失败:', e);
        return null;
    }
}

/**
 * 检查当前用户是否有指定权限
 * @param {string} permission 权限名称
 * @returns {boolean} 是否有权限
 */
function hasPermission(permission) {
    console.log('hasPermission',permission);
    const role = getCurrentUserRole();
    console.log('role',role);
    const permissions = ROLE_PERMISSIONS[role] || [];
    console.log('permissions',permissions);
    return permissions.includes(permission);
}

/**
 * 检查当前用户是否是操作员
 * @returns {boolean} 是否是操作员
 */
function isOperator() {
    return getCurrentUserRole() === USER_ROLES.OPERATOR;
}

/**
 * 检查当前用户是否是观察员
 * @returns {boolean} 是否是观察员
 */
function isViewer() {
    return getCurrentUserRole() === USER_ROLES.VIEWER;
}

/**
 * 检查当前用户是否是管理员
 * @returns {boolean} 是否是管理员
 */
function isAdmin() {
    return getCurrentUserRole() === USER_ROLES.ADMIN;
}

/**
 * 应用权限控制到页面元素
 * 根据当前用户角色隐藏或禁用无权限的元素
 */
function applyPermissionControls() {
    console.log('applyPermissionControls');
    // 控制设备按钮
    const controlButtons = document.querySelectorAll('[data-permission="control_device"]');
    controlButtons.forEach(button => {
        if (!hasPermission(PERMISSIONS.CONTROL_DEVICE)) {
            console.log('没有控制设备权限');
            // 如果是观察员，禁用控制按钮
            button.disabled = true;
            button.classList.add('disabled-for-viewer');
            // 添加提示
            button.title = "您没有权限执行此操作";
        }else{
            console.log('有控制设备权限');
        }
    });

    // 设置相关元素
    const settingsElements = document.querySelectorAll('[data-permission="change_settings"]');
    settingsElements.forEach(element => {
        if (!hasPermission(PERMISSIONS.CHANGE_SETTINGS)) {
            // 如果是观察员，隐藏设置元素
            element.style.display = 'none';
        }
    });

    // 管理员功能
    const adminElements = document.querySelectorAll('[data-permission="admin_functions"]');
    adminElements.forEach(element => {
        if (!hasPermission(PERMISSIONS.ADMIN_FUNCTIONS)) {
            // 隐藏管理员功能
            element.style.display = 'none';
        }
    });
}


/**
 * 检查权限状态
 * 用于调试
 */
function checkPermissionStatus() {
    const role = getCurrentUserRole();
    console.log('当前用户角色:', role);

    const permissions = {
        '查看数据': hasPermission(PERMISSIONS.VIEW_DATA),
        '控制设备': hasPermission(PERMISSIONS.CONTROL_DEVICE),
        '修改设置': hasPermission(PERMISSIONS.CHANGE_SETTINGS),
        '管理员功能': hasPermission(PERMISSIONS.ADMIN_FUNCTIONS)
    };

    console.log('权限状态:', permissions);
    return permissions;
}



// 在页面加载完成后自动应用权限控制和检查修复权限
document.addEventListener('DOMContentLoaded', function () {
    // 应用权限控制
    console.log('应用权限控制，当前用户角色:', getCurrentUserRole());
    applyPermissionControls();
});

// 导出工具函数
window.PermissionUtils = {
    USER_ROLES,
    PERMISSIONS,
    getCurrentUserRole,
    hasPermission,
    isOperator,
    isViewer,
    isAdmin,
    applyPermissionControls,
    checkPermissionStatus,
}; 